﻿using System;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using System.Text;
using Sinacor.Infra.Service.Data;
using Sinacor.Infra.Service.Security.Authorization;
using System.Collections.Generic;


namespace Sinacor.Servico.Bovespa.Custodia.ResourceAccess
{
    public class Custodia : BaseResourceAccess
    {

        #region Construtor
        public Custodia()
            : base(AuthorizationContext.Current.CompanyId)
        {
        
        }

        #endregion

        /// <summary>
        /// Historico:
        /// Data : 19/12/2007
        /// Autor: Ludmilla Modesto 
        /// Obs.: Criado. Metodo que retorna a posicao do cliente na custodia
        /// -----------------------------------------------------------------------------------
        ///  Autor              | Data          | Alteração
        /// -----------------------------------------------------------------------------------
        ///  Márcio Belarmino   | 07.08.2008    | Ajuste para Infra 2.0
        /// -----------------------------------------------------------------------------------
        /// </summary>
        /// <returns></returns>
        public BusinessEntity.PosicaoCustodia
          ConsultarPosicaoCustodia(Sinacor.Servico.Bovespa.Cliente.BusinessEntity.Cliente clienteRequest, DateTime dataSistema, List<String> Ativos, Int32 ?  carteira)
        {
            Sinacor.Servicos.Comum.Util.SGBD.DBParameters dbParams = new Sinacor.Servicos.Comum.Util.SGBD.DBParameters();
            BusinessEntity.PosicaoCustodia bePosicaoCustodia = null;

            //OracleDataBase dbOrdem = new OracleDataBase(SessionData.GetCompanyID());
            OracleDataBase dbCustodia = this.DataBase;
            DbCommand dbCommand;

            #region select
            StringBuilder sqlComando = new StringBuilder("SELECT ");
            sqlComando.Append("a.in_conta_inv, ");
            sqlComando.Append("a.CODNEG, ");
            sqlComando.Append("a.qt_disp, ");
            sqlComando.Append("a.qt_ngcv, ");
            sqlComando.Append("a.qt_proj, ");
            sqlComando.Append("a.qt_exec, ");
            sqlComando.Append("a.qt_indi, ");
            sqlComando.Append("a.cd_carteira, ");
            sqlComando.Append("a.vl_custo, ");
            sqlComando.Append("a.vl_atual, ");
            sqlComando.Append("a.qt_aexe, ");
            //sqlComando.Append("(decode(a.vl_custo,0,0,(a.vl_atual/a.vl_custo)-1)*100) as Variacao, "); //excluido - esertorio - 200805281854 - ref issue ID0005028
            sqlComando.Append("(decode(a.vl_custo,0,0,round(a.vl_atual/a.vl_custo,12)-1)*100) as Variacao, "); //incluido - esertorio - 200805281854 - ref issue ID0005028
            sqlComando.Append("a.qt_ant_30092004, a.cod_estd_dir_ativ ");
            sqlComando.Append("FROM V_POSCLI a, tboclientes b ");
            sqlComando.Append("WHERE  ");
            //sqlComando.Append("( b.cd_cliente_nor = :CodigoCliente ");
            //sqlComando.Append("or b.cd_cliente_ci = :CodigoCliente ) ");            
            sqlComando.Append(" a.IN_CONTA_INV = b.in_conta_inv ");
            //sqlComando.Append("and a.codcli = b.cd_cliente_ori ");
            sqlComando.Append(" and :CodigoCliente in ( b.cd_cliente_nor, b.cd_cliente_ci ) ");
            //sqlComando.Append(" and a.codcli = :CodigoCliente ");
            sqlComando.Append("AND  ");
            sqlComando.Append("( a.qt_ngcv <> 0 ");
            sqlComando.Append("OR a.qt_proj <> 0 ");
            sqlComando.Append("OR a.qt_exec <> 0 ");
            sqlComando.Append("OR a.qt_aexe <> 0 ");
            sqlComando.Append("or a.qt_ant_30092004 <> 0 ) ");
            sqlComando.Append("and a.nm_terminal = :UserId ");
            sqlComando.Append("and b.nm_terminal = :IP "); //ficara comentado ate a versao 4.13 - esertorio - 200805081335 - ref issue ID0004563
            sqlComando.Append("and b.dt_sistema = :DataSistema ");
            sqlComando.Append("and a.codcli = b.cd_cliente_ori ");

            if (carteira != null) 
            {
                dbParams.Add("Carteira", DbType.Int32, carteira);
                sqlComando.Append("and a.cd_carteira = :Carteira");

            }   
            if (Ativos != null &&
                Ativos.Count > 0)
            {
                String strAtivos = String.Empty;

                for (int i = 0; i < Ativos.Count; i++)
                {
                    if (i == 0)
                        strAtivos = "'" + Ativos[i].Trim() + "'";
                    else
                        strAtivos += ",'" + Ativos[i].Trim() + "'";
                }

                sqlComando.Append("and a.CODNEG IN (" + strAtivos + ")");
            }

            //sqlComando.Append("and ( ( a.in_origem = 'S' and a.dt_sistema = :DataSistema ) or ( a.in_origem = 'N' ) ) "); //ficara comentado ate a versao 4.13 - esertorio - 200805081719 - ref issue ID0004563
            sqlComando.Append("order by 2  ");

            #endregion

            dbParams.Add("CodigoCliente", DbType.Int32, clienteRequest.Codigo);
            dbParams.Add("DataSistema", DbType.DateTime, dataSistema);

            dbParams.Add("UserId", DbType.String, AuthorizationContext.Current.UserId);

            dbParams.Add("IP", DbType.String, AuthorizationContext.Current.ClientHost.Ip);
            
            dbCommand = dbCustodia.GetSqlStringCommand(sqlComando.ToString());

            dbParams.PopulaParametros(dbCustodia, dbCommand);

            IDataReader dtReaderCustodia = dbCustodia.ExecuteReader(dbCommand);

            DateTime dataSistemaCustodia = new Sinacor.Servico.Bovespa.Comum.ResourceAccess.Parametros().RecuperarDataSistemaCustodia();

            #region popula

            /// Data:05/03/2008 13:01
            /// Autor:DMilanez.7Comm
            /// Obs:
            /// Corrigido de forma a instanciar os objetos fora do While
            bePosicaoCustodia = new BusinessEntity.PosicaoCustodia();
            bePosicaoCustodia.Custodias = new List<BusinessEntity.Custodia>();

            while (dtReaderCustodia.Read())
            {
                BusinessEntity.Custodia beCustodia = new BusinessEntity.Custodia();

                beCustodia.Anterior102004 = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dtReaderCustodia["qt_ant_30092004"]);
                beCustodia.Carteira = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorInt32(dtReaderCustodia["cd_carteira"]);
                beCustodia.Custo = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dtReaderCustodia["vl_custo"]);
                beCustodia.isContaInvestimento = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(dtReaderCustodia["in_conta_inv"]) == "S";
                beCustodia.QuantidadeDisponivel = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dtReaderCustodia["qt_disp"]);
                beCustodia.NegocioExecutar = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dtReaderCustodia["qt_aexe"]);
                beCustodia.QuantidadeNegociavel = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dtReaderCustodia["qt_ngcv"]);
                beCustodia.NegociosDia = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dtReaderCustodia["qt_exec"]);
                beCustodia.QuantidadeProjetado = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dtReaderCustodia["qt_proj"]);
                beCustodia.Titulo = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(dtReaderCustodia["CODNEG"]);
                beCustodia.ValorAtual = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dtReaderCustodia["vl_atual"]);
                beCustodia.Variacao = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dtReaderCustodia["Variacao"]);
                beCustodia.QuantidadeInd = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dtReaderCustodia["qt_indi"]);
                beCustodia.PosicaoCustodia = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(dtReaderCustodia["cod_estd_dir_ativ"]);
                bePosicaoCustodia.Custodias.Add(beCustodia);
            }

            bePosicaoCustodia.DataPosicao = dataSistemaCustodia;//20080424 17:48 - Alterado - DMilanez.7Comm

            dtReaderCustodia.Close();
            #endregion

            return bePosicaoCustodia;
        }

        /// <summary>
        /// Historico:
        /// Data : 19/12/2007
        /// Autor: Ludmilla Modesto 
        /// Obs.: Criado. Metodo que popula a tabela de custodia
        /// 
        /// Data:22/04/2008 16:28
        /// Autor:DMilanez.7Comm
        /// Obs: Alterado para atender ao chamado 3263
        /// </summary>
        /// <returns></returns>
        public void PopulaCustodia(Sinacor.Servico.Bovespa.Cliente.BusinessEntity.Cliente clienteRequest, DateTime dataSistema)
        {
            string sDataSistema;
            string sessionId;
            Sinacor.Servicos.Comum.Util.SGBD.DBParameters dbParams = new Sinacor.Servicos.Comum.Util.SGBD.DBParameters();
            OracleDataBase dbCustodia = this.DataBase;
            DbCommand dbCommand;

            //20080422 16:28 - Alterado para atender ao chamado 3263 - DMilanez.7Comm
            StringBuilder sqlComando = new StringBuilder("SELECT ");
            sqlComando.AppendLine("cd_cliente_ori ");
            sqlComando.AppendLine("from tboclientes ");
            sqlComando.AppendLine("where dt_sistema  = :dataSistema ");
            //sqlComando.AppendLine("and nm_terminal = :sessionId "); //ficara comentado ate a versao 4.13 - esertorio - 200805081335 - ref issue ID0004563
            sqlComando.AppendLine("and (    cd_cliente_nor = :codigoCliente ");
            sqlComando.AppendLine("or cd_cliente_ci  = :codigoCliente )");

            sessionId = AuthorizationContext.Current.UserId.ToString();

            dbParams.Add("codigoCliente", DbType.Int32, clienteRequest.Codigo);
            dbParams.Add("dataSistema", DbType.DateTime, dataSistema);
            //dbParams.Add("sessionId", DbType.String, sessionId); //ficara comentado ate a versao 4.13 - esertorio - 200805081335 - ref issue ID0004563

            dbCommand = dbCustodia.GetSqlStringCommand(sqlComando.ToString());

            dbParams.PopulaParametros(dbCustodia, dbCommand);

            IDataReader dtReaderCustodia = dbCustodia.ExecuteReader(dbCommand);

            StringBuilder sqlProcedure = new StringBuilder();

            //20080422 16:28 - Alterado para atender ao chamado 3263 - DMilanez.7Comm
            sqlProcedure.Append("Begin ");
            sqlProcedure.Append("SPCF_CONS_POSI.SPCF_MONTAPOSI (:codigoCliente, '-1', -1, '-1', -1, -1, '-1', :sessionId, :sDataSistema, 'N' );");
            sqlProcedure.Append("End; ");

            dbCommand = dbCustodia.GetSqlStringCommand(sqlProcedure.ToString());

            //20080422 16:28 - Alterado para atender ao chamado 3263 - DMilanez.7Comm
            sDataSistema = dataSistema.ToString("yyyyMMddHHmmss");
            while (dtReaderCustodia.Read())
            {
                //20080422 16:28 - Alterado para atender ao chamado 3263 - DMilanez.7Comm
                dbCustodia.AddInParameter(dbCommand, ":codigoCliente", DbType.Int32, dtReaderCustodia.GetInt32(0));
                dbCustodia.AddInParameter(dbCommand, ":sessionId", DbType.AnsiString, sessionId);
                dbCustodia.AddInParameter(dbCommand, ":sDataSistema", DbType.AnsiString, sDataSistema);

                dbCustodia.ExecuteNonQuery(dbCommand);
            }

            dtReaderCustodia.Close();
        }

    }
}
